package com.witmore.neutron.ai.mcp.server.trading;

import com.witmore.neutron.ai.mcp.server.trading.db.entity.ScorpionTradingUserDO;
import com.witmore.neutron.ai.mcp.server.trading.dto.ScorpionStockAbnormalRecordDTO;
import com.witmore.neutron.ai.mcp.server.trading.dto.StockRealTimeInfoResponse;
import com.witmore.neutron.ai.mcp.server.trading.dto.StockRealTimeInfoSingleResponse;
import com.witmore.neutron.ai.mcp.server.trading.service.AlertConfigService;
import com.witmore.neutron.ai.mcp.server.trading.service.IAkShareMcpService;
import com.witmore.neutron.ai.mcp.server.trading.service.StockAbnormalRecordService;
import com.witmore.neutron.ai.mcp.server.trading.service.StockNameToCodeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * Description: AkShareMcpServer
 * Author: 豆子高
 * Date: 2025/8/4 14:32
 */
@Slf4j
@Service
public class AkShareMcpServer {

    @Autowired
    private IAkShareMcpService akShareMcpService;

    @Autowired
    private StockAbnormalRecordService stockAbnormalRecordService;

    @Autowired
    private AlertConfigService alertConfigService;

    @Autowired
    private StockNameToCodeService stockNameToCodeService;


    @Tool(description = "根据传入的股票代码实时获取股票最新信息（数据来源：东方财经）")
    public StockRealTimeInfoSingleResponse stockIndividualInfoEm(@ToolParam(description = "要查询的股票代码 仅支持单个查询") String symbol) {
        try {
            return akShareMcpService.stockIndividualInfoEm(symbol);
        } catch (Exception e) {
            log.error("stockChangesEm error: {}", e.getMessage());
            return new StockRealTimeInfoSingleResponse("500", e.getMessage(), null, System.currentTimeMillis());
        }
    }

    /**
     * 批量获取多个股票代码的实时行情数据
     * <p>
     * 功能说明：
     * 1. 支持同时查询多个股票代码的实时行情
     * 2. 最多支持10个股票代码同时查询
     * 3. 调用东财第三方接口获取全量数据后进行筛选
     * 4. 返回匹配的股票实时行情数据列表
     *
     * @param symbols 股票代码列表，用逗号分隔，例如："000001,000002,600036"
     * @return 匹配的股票实时行情数据列表
     */
    @Tool(description = "批量获取多个股票代码的实时行情数据（数据来源：东方财经）")
    public List<StockRealTimeInfoResponse> stockRealTimeInfoMultiple(
            @ToolParam(description = "要查询的股票代码列表，用逗号分隔，最多支持10个股票代码，例如：000001,000002,600036") String symbols) {
        try {
            // 参数验证：检查输入是否为空
            if (symbols == null || symbols.trim().isEmpty()) {
                log.error("股票代码参数不能为空");
                return new java.util.ArrayList<>();
            }

            // 解析股票代码并验证数量限制
            String[] symbolArray = symbols.trim().split(",");
            if (symbolArray.length > 10) {
                log.error("股票代码数量超过限制，最多支持10个，当前传入：{}", symbolArray.length);
                return new java.util.ArrayList<>();
            }

            // 验证每个股票代码不为空
            for (String symbol : symbolArray) {
                if (symbol.trim().isEmpty()) {
                    log.error("存在空的股票代码");
                    return new java.util.ArrayList<>();
                }
            }

            log.info("开始查询 {} 个股票代码的实时行情数据", symbolArray.length);

            // 调用服务获取筛选后的数据
            return akShareMcpService.stockRealTimeInfoEm(symbols);
        } catch (Exception e) {
            log.error("stockRealTimeInfoMultiple error: {}", e.getMessage());
            return new java.util.ArrayList<>();
        }
    }

    /**
     * 根据用户手机号查询股票异动记录
     *
     * @param phone     用户手机号
     * @param stockCode 股票代码（可选）
     * @param limit     限制返回条数，默认10条，最大100条
     * @return 股票异动记录列表
     */
    @Tool(description = "查询股票异动记录，支持按股票代码筛选")
    public List<ScorpionStockAbnormalRecordDTO> queryStockAbnormalRecords(
            @ToolParam(description = "$_yumo_agent_user_phone_$") String phone,
            @ToolParam(description = "股票代码（可选），如果不填则查询用户所有异动记录", required = false) String stockCode,
            @ToolParam(description = "查询起始时间，时间格式yyyy-MM-dd HH:mm:ss", required = false) String startTime,
            @ToolParam(description = "查询结束时间，时间格式yyyy-MM-dd HH:mm:ss", required = false) String endTime,
            @ToolParam(description = "限制返回条数，默认10条，最大100条", required = false) Integer limit) {
        try {
            // 参数验证
            if (phone == null || phone.trim().isEmpty()) {
                log.error("用户手机号参数无效：{}", phone);
                return new java.util.ArrayList<>();
            }

            // 通过AlertConfigService查找或创建用户
            ScorpionTradingUserDO user = alertConfigService.findOrCreateUser(phone.trim());
            if (user == null) {
                log.error("根据手机号未找到或创建用户失败：{}", phone);
                return new java.util.ArrayList<>();
            }
            Long userId = user.getId();

            // 设置默认值和限制
            if (limit == null || limit <= 0) {
                limit = 10;
            }
            if (limit > 100) {
                limit = 100;
            }

            // 调用公用的Service方法
            return stockAbnormalRecordService.queryAbnormalRecordsList(userId, stockCode, startTime, endTime, limit);

        } catch (Exception e) {
            log.error("查询股票异动记录失败 - 手机号: {}, 股票代码: {}", phone, stockCode, e);
            return new java.util.ArrayList<>();
        }
    }

    /**
     * 根据股票名称查询股票代码
     * <p>
     * 功能说明：
     * - 支持模糊匹配股票名称
     * - 返回匹配的股票代码、完整名称、市场标识等信息
     * - 使用大模型进行智能匹配（当前为测试实现）
     *
     * @param stockName 股票名称，支持模糊匹配，如"茅台"、"平安"、"招商银行"等
     * @return 匹配的股票信息列表，包含股票代码、名称、市场标识等
     */
    @Tool(description = "根据股票名称查询对应的股票代码，支持模糊匹配。例如：输入'茅台'可以查询到'贵州茅台(600519)'")
    public String getStockCodeByName(
            @ToolParam(description = "要查询的股票名称，支持模糊匹配，如'茅台'、'平安银行'、'招商'等") String stockName) {

        log.info("📊 [MCP工具调用] getStockCodeByName - 接收到股票名称查询请求");
        log.info("🔍 请求参数 - 股票名称: [{}]", stockName);

        // 参数校验
        if (stockName == null || stockName.trim().isEmpty()) {
            log.warn("⚠️ 参数校验失败 - 股票名称为空或空字符串");
            return "错误：股票名称不能为空，请提供有效的股票名称";
        }

        String trimmedStockName = stockName.trim();
        log.info("✅ 参数校验通过 - 处理后的股票名称: [{}]", trimmedStockName);

        try {
            log.info("🚀 开始调用股票名称查询服务 - StockNameToCodeService");
            String stockCodeByName = stockNameToCodeService.getStockCodeByName(trimmedStockName);
            log.info("🚀 获取股票代码成功 - 股票代码: [{}]", stockCodeByName);
            return stockCodeByName;
        } catch (Exception e) {
            log.error("💥 MCP工具异常 - getStockCodeByName调用过程中发生未预期异常");
            log.error("📋 异常详情 - 股票名称: [{}], 异常类型: {}, 异常信息: {}",
                    trimmedStockName, e.getClass().getSimpleName(), e.getMessage(), e);
            return "系统异常：" + e.getMessage() + "，请联系管理员";
        }
    }

}
